package com.yz.delayqueue;

import lombok.Data;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * 消息体定义 实现Delayed接口就是实现两个方法即compareTo 和 getDelay最重要的就是getDelay方法，这个方法用来判断是否到期。
 *
 * @author yuanzheng
 * @date 2020/11/16-17:13
 */
@Data
public class DelayMessage implements Delayed {
    private int id;
    private String messageBody;
    /**
     * 延迟时长，这个是必须的属性因为要按照这个判断延时时长。
     */
    private long delayTime = System.currentTimeMillis();

    public DelayMessage(int id, String messageBody, long delayTime) {
        this.delayTime += delayTime;
        this.id = id;
        this.messageBody = messageBody;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(this.delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    /**
     * 自定义实现比较方法返回 1 0 -1三个参数，
     *
     * @param
     * @return 延迟任务是否到时就是按照这个方法判断如果返回的是负数则说明到期否则还没到期。
     */
    @Override
    public int compareTo(Delayed delayed) {
        DelayMessage msg = (DelayMessage) delayed;
        return Integer.compare(this.id, msg.id);
    }
}